/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.manager.create;

import br.com.foxline.atlasmobile.enums.TipoDocumento;
import br.com.foxline.model.*;
import br.com.foxline.service.ImovelService;
import br.com.foxline.service.ProprietarioService;
import br.com.foxline.service.RegistrationService;
import br.com.foxline.util.Msg;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
//import org.apache.commons.lang.SerializationUtils;

/**
 *
 * @author luciano
 */
@ManagedBean
@ViewScoped
public class ManagerRegistration implements Serializable {

    private Imovel imovel;
    private String imovelId;
    @EJB
    private ImovelService imovelDao;
    @EJB
    private ProprietarioService proprietarioService;
    @EJB
    private RegistrationService registrationService;
    //Averbação mudança de Nome
    private String newName;
    //Averbação Transferencia
    List<Proprietario> oldProprietarios;
    List<Proprietario> newProprietarios;
    //Averbaçao de Desmembramento
    List<Imovel> imoveis;
    Imovel mainImovel;
    Imovel newImovel;
    BigDecimal area;
    private Proprietario proprietario;
    private Registration averbacao;
    private Registration averbacaoReferente;

    @PostConstruct
    public void init() {
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(TipoDocumento.CPF);
        proprietario.setEndereco(new Endereco());
        imovel = new Imovel();
        imoveis = new ArrayList<Imovel>();
        averbacao = new Registration();
        newImovel = new Imovel();
        newImovel.setDimensoes(new Dimensao());
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        imovelId = params.get("imovelId");
        try {
            imovel = imovelDao.find(Long.parseLong(imovelId));
            oldProprietarios = imovel.getProprietarios();
            newProprietarios = new ArrayList<Proprietario>();
            mainImovel = imovel;
            imoveis.add(imovel);
            area = imovel.getDimensoes().getAreaTerreno();
            newImovel = mainImovel;
        } catch (Exception e) {
        }
    }

    public void mudaProprietario(Proprietario p) {
        proprietario = p;
        newName = proprietario.getNome();
    }

    public void saveAverbacaoPorNome() {
        try {

            String oldName = proprietario.getNome();

            averbacao.setRegistration(averbacaoReferente);
            averbacao.setNomeAnterior(oldName);
            averbacao.setNomeAtual(newName);
            averbacao.setImovel(imovel);
            averbacao.setTipoAverbacao(TypeRegistration.MUDANCA_NOME);
            registrationService.save(averbacao);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError("Erro ao atualizar/salvar a averbação !");
        }
        try {

            proprietario.setNome(newName);
            proprietarioService.update(proprietario);
            RequestContext requestContext = RequestContext.getCurrentInstance();
            requestContext.execute("printDialog.show()");
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError("Erro ao atualizar o proprietário !");
        }

        //   Msg.messagemInfoRedirect("Averbação realizada.", "pesquisarimovel.xhtml");
    }

    ///Métodos Transferência
    public void addProprietario() {
        newProprietarios.add(proprietario);
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(TipoDocumento.CPF);
        proprietario.setEndereco(new Endereco());
    }

    public void selecionaProprietario(Proprietario proprietario) {
        if (!newProprietarios.contains(proprietario)) {
            newProprietarios.add(proprietario);
        } else {
            Msg.messagemWarn("Proprietario já inserido.");
        }
    }

    public String tituloAverbacao(Registration r) {
        return String.format("%05d", r.getId()) + " - " + r.getTipoAverbacao().getNome() + " - " + registrationService.formatDate(r.getDataAverbacao());
    }

    public void removeProprietario(Proprietario proprietario) {
        newProprietarios.remove(proprietario);
    }

    public void salvarPorTransferencia() {

        imovel.setProprietarios(newProprietarios);

        for (Proprietario pro : imovel.getProprietarios()) {
            if (pro.getId() == null) {
                proprietarioService.save(pro);
            }
        }
        imovelDao.update(imovel);

        imovel = imovelDao.find(imovel.getId());

        averbacao.setAdquirente(imovel.getProprietarios());
        averbacao.setTransmitente(oldProprietarios);
        averbacao.setImovel(imovel);
        averbacao.setRegistration(averbacaoReferente);
        averbacao.setTipoAverbacao(TypeRegistration.TRANSFERENCIA);
        registrationService.save(averbacao);
        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("printDialog.show()");
        //     averbacao = new Registration();
        //      registrationService.printRegistration(averbacao);

    }

    public void print() {
        registrationService.printRegistration(averbacao);
    }

    public void redirect() {
        Msg.messagemInfoRedirect("Averbação realizada", "pesquisarimovel.xhtml");
    }

    //Métodos para Desmembramento
    public void salvarAverbacaoDesmembramento() {
        averbacao = new Registration();
        averbacao.setImoveis(imoveis);
        averbacao.setImovel(mainImovel);
        averbacao.setTipoAverbacao(TypeRegistration.DESMEMBRAMENTO);
        averbacao.setDataAverbacao(new Date());
        registrationService.update(averbacao);
        Msg.messagemInfoRedirect("Desmembramento realizado", "pesquisarimovel.xhtml");
    }

    public void addImovel() throws CloneNotSupportedException {
        if (newImovel.getDimensoes().getAreaTerreno().compareTo(area) < 0) {
            area = area.subtract(newImovel.getDimensoes().getAreaTerreno());
            imoveis.add(newImovel(mainImovel));
            this.imoveis.get(0).getDimensoes().setAreaTerreno(area);
            newImovel = mainImovel;
        } else {
            Msg.messagemError("Área maior do que o disponível");
        }
    }

    public void removeImovel(Imovel imovel) {
        area = area.add(imovel.getDimensoes().getAreaTerreno());
        this.imoveis.get(0).getDimensoes().setAreaTerreno(area);
        imoveis.remove(imovel);
    }

    public Imovel newImovel(Imovel oldImovel) throws CloneNotSupportedException {
        Imovel i = oldImovel.clone();
        i.setLadoDireito(newImovel.getLadoDireito());
        i.setLadoEsquerdo(newImovel.getLadoEsquerdo());
        i.setFrente(newImovel.getFrente());
        i.setFundo(newImovel.getFundo());

        i.setDimensoes(newImovel.getDimensoes().clone());
        i.setImovel(mainImovel);
        return i;
    }

    public List<Registration> autocomplete() {
        return registrationService.getByImovel(imovel);
    }

    public String nomeDosProprietarios(Imovel imovel) {
        return registrationService.getNomeProprietarios(imovel.getProprietarios());
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public String getNewName() {
        return newName;
    }

    public void setNewName(String newName) {
        this.newName = newName;
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public Registration getAverbacao() {
        return averbacao;
    }

    public void setAverbacao(Registration averbacao) {
        this.averbacao = averbacao;
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Imovel getMainImovel() {
        return mainImovel;
    }

    public void setMainImovel(Imovel mainImovel) {
        this.mainImovel = mainImovel;
    }

    public Imovel getNewImovel() {
        return newImovel;
    }

    public void setNewImovel(Imovel newImovel) {
        this.newImovel = newImovel;
    }

    public List<Proprietario> getOldProprietarios() {
        return oldProprietarios;
    }

    public void setOldProprietarios(List<Proprietario> oldProprietarios) {
        this.oldProprietarios = oldProprietarios;
    }

    public List<Proprietario> getNewProprietarios() {
        return newProprietarios;
    }

    public void setNewProprietarios(List<Proprietario> newProprietarios) {
        this.newProprietarios = newProprietarios;
    }

    public Registration getAverbacaoReferente() {
        return averbacaoReferente;
    }

    public void setAverbacaoReferente(Registration averbacaoReferente) {
        this.averbacaoReferente = averbacaoReferente;
    }
}
